#pragma once

#include "iostream"
#include "string.h"
#include "vector"
#include "algorithm"

using namespace std;
/*HJJ QQ479287006
 *
 *给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。

 

示例 1:

输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
     请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。

来源：力扣（LeetCode）
链接：https://leetcode.cn/problems/longest-substring-without-repeating-characters
字节要求一次 循环过
 * */
int lengthOfLongestSubstring1(string s) {
    int maxV=0;
    int temp[255]={0};

    int startIndex=0;//起始位置
    //i 代表终止位置 原来双重那个一个终止一个开始
    for (int i = 0; i <s.size() ; ++i) {
        ++temp[s[i]];
        while (temp[s[i]]>1)
        {
           -- temp[s[startIndex++]];//头指针后移
        }
        maxV=max(maxV,i-startIndex+1);

    }


    return maxV;

}

//暴力解法 真的服了  memset(temp,0,sizeof temp); 这个必须放在你下面 我怀疑是我写死255的原因
int lengthOfLongestSubstring(string s) {
    int maxV=0;
    int temp[256]={0};
    for (int i = 0; i <s.size() ; ++i) {

        ++temp[s[i]];
        for (int j = i+1; j <s.size() ; ++j) {
            if (temp[s[j]]==0)
            {
                ++temp[s[j]];

            } else{

                maxV=max(maxV,j-i);
                memset(temp,0,sizeof temp);
                break;
            }
            maxV=max(maxV,j-i+1);

        }

    }

    if (maxV==0&&s.size()>0)
        return 1;

    return maxV;

}